package com.woniuxy.Aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

/**
 * @Author：向天浩
 * @Date：2022/1/20 16:51
 * @Description :基于Aspectj配置xml模式的切面；只需要通知即可。不管是配置xml的方式还是加注解的方式都需要配这个切面类
 */

public class MyAspectj {
    //前置通知 需要引入参数JoinPoint；它需要导入org.aspectj.lang.JoinPoint这个包
    public void myBefore(JoinPoint JoinPoint){
            System.out.println("前置通知，模拟判断是否有注解");
            //通过JoinPoint可以获取到我们的目标类
            System.out.println("目标类是:"+ JoinPoint.getTarget().getClass().getName());
            System.out.println("被增强的目标类的方法是:"+JoinPoint.getSignature().getName());
    }
    //后置通知
    public void myAfterReturn(JoinPoint JoinPoint){
        System.out.println("后置通知，模拟事务提交...");
        //通过JoinPoint可以获取到我们的目标类
        System.out.println("目标类是:"+ JoinPoint.getTarget().getClass().getName());
        System.out.println("被增强的目标类的方法是:"+JoinPoint.getSignature().getName());

    }
    //环绕通知；不推荐使用这个，因为环绕通知的能力非常变态，可以拦截方法传入的参数进行修改，或者对方法返回的结果进行修改，所以一般不要使用这个
    //参数是ProceedingJoinPoint
    public Object myAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("在执行目标方法之前，执行环绕方法...");
        Object proceed = proceedingJoinPoint.proceed();
        System.out.println("在执行目标方法之后，执行环绕方法...");

        return proceed;
    }

    //异常通知,需要一个额外参数 Throwable异常
    public void myAfterThrow(JoinPoint JoinPoint,Throwable e){
        System.out.println("异常通知");
        System.out.println("报错信息"+e.getMessage());
    }

    //最终通知
    public void myAfter(){
      System.out.println("最终通知：模拟方法结束后释放资源，关闭SqlSession……");

    }

}
